package com.wzdigit.wms.basic.util;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wzdigit.wms.basic.domain.dtos.inventory.CreateLotnoDto;
import com.wzdigit.wms.basic.domain.inventory.Lotno;
import com.wzdigit.wms.basic.util.StringUtils;
import com.wzdigit.wms.basic.util.common.SeparatorString;
import java.lang.reflect.Field;
import java.util.Set;

/**
 * 批次号工具
 * @author Administrator
 *
 */
public class LotnoUtils {
	
	/**
	 * 生成批次号redis-lock-key（注：物料  + 批次属性ID + 关键属性）
	 * 
	 * @param dto			批次号生成入参
	 * @param keyAttrSeqSet	关键属性位置
	 * @return
	 * @throws Exception
	 */
	public static String createRedisLockKeyOnlyKeyAttr(CreateLotnoDto dto, Set<Integer> keyAttrSeqSet) throws Exception {
		String separator = SeparatorString.OTHER_01;
		StringBuffer lotnoKeyBuffer = new StringBuffer();
		lotnoKeyBuffer.append(dto.getSkuId()).append(separator).append(dto.getLotAttrId());
		
		boolean flag = false;
		Class<? extends CreateLotnoDto> className = dto.getClass();
		for (int i = 1; i < 13; i++) {
			// 关键属性
			if (keyAttrSeqSet.contains(i)) {
				Field field = className.getDeclaredField("lotAttr" + i);
				field.setAccessible(true);
				Object value = field.get(dto);
				if (value != null && StringUtils.isNotNull(value.toString())) {
					flag = true;
					lotnoKeyBuffer.append(separator).append(value.toString());
				} else {
					lotnoKeyBuffer.append(separator).append("null");
				}
			}
		}
		if (!flag) {
			throw new Exception("不允许生成批次号，所有关键的批次属性都为空！");
		}
		return lotnoKeyBuffer.toString();
	}
	
	/**
	 * 排除非关键属性的检验
	 * 
	 * @param dto			批次号生成入参
	 * @param keyAttrSeqSet 关键属性位置
	 * @return 
	 * @throws Exception
	 */
	public static QueryWrapper<Lotno> queryWrapperLotAttrOnlyKeyAttr(CreateLotnoDto dto, Set<Integer> keyAttrSeqSet) throws Exception {
		QueryWrapper<Lotno> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("SKU_ID", dto.getSkuId());			// 物料ID
        queryWrapper.eq("LOT_ATTR_ID", dto.getLotAttrId());	// 批次属性ID
        queryWrapper.orderByDesc("LOTNO_ID");
        
		Class<? extends CreateLotnoDto> className = dto.getClass();
		for (int i = 1; i < 13; i++) {
			String fieldName = "lotAttr" + i;			// 属性名
			String column = "LOT_ATTR_" + i;			// 字段名
			
			// 关键属性
			if (keyAttrSeqSet.contains(i)) {
				Field field = className.getDeclaredField(fieldName);
				field.setAccessible(true);
				Object value = field.get(dto);
				if (value != null && StringUtils.isNotNull(value.toString())) {
					queryWrapper.eq(column, value.toString());
				} else {
					queryWrapper.isNull(column);
				}
			}
		}
		return queryWrapper;
	}
	
	/**
	 * 需要检验非关键属性
	 * 
	 * @param dto			批次号生成入参
	 * @param keyAttrSeqSet	关键属性位置
	 * @param isEq			true：对非关键属性只进行等值查询、     false：对非关键属性只进行模糊查询
	 * @return 
	 * @throws Exception
	 */
	public static QueryWrapper<Lotno> queryWrapperLotAttr(CreateLotnoDto dto, Set<Integer> keyAttrSeqSet, boolean isEq) throws Exception {
		QueryWrapper<Lotno> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("SKU_ID", dto.getSkuId());			// 物料ID
        queryWrapper.eq("LOT_ATTR_ID", dto.getLotAttrId());	// 批次属性ID
        queryWrapper.orderByDesc("LOTNO_ID");
        
		Class<? extends CreateLotnoDto> className = dto.getClass();
		for (int i = 1; i < 13; i++) {
			String fieldName = "lotAttr" + i;			// 属性名
			String column = "LOT_ATTR_" + i;			// 字段名
			
			Field field = className.getDeclaredField(fieldName);
			field.setAccessible(true);
			Object value = field.get(dto);
			if (keyAttrSeqSet.contains(i)) {
				// 关键属性使用等值查询
				if (value != null && StringUtils.isNotNull(value.toString())) {
					queryWrapper.eq(column, value.toString());
				} else {
					queryWrapper.isNull(column);
				}
			} else {
				// 非关键属性使用模糊查询
				if (value != null && StringUtils.isNotNull(value.toString())) {
					if(isEq) {
						queryWrapper.eq(column, value.toString());		// 等值
					} else {
						queryWrapper.and(wrapper -> 
							wrapper.likeRight(column, value.toString() + SeparatorString.COMMA)						// 右模糊
							.or().likeLeft(column, SeparatorString.COMMA + value.toString())						// 左模糊
							.or().like(column, SeparatorString.COMMA + value.toString() + SeparatorString.COMMA));	// 全模糊
					}
				}
			}
		}
		return queryWrapper;
	}
}
